# -*- coding: utf-8 -*-
# @Time    : 2019/10/23 10:28
# @Author  : LiHaowen
# @Email   : lihaowen2017@163.com
# @File    : python_thread.py
# 操作系统能够切换和调度的最小单元是线程
# 线程依赖于进程
# 对于io操作而言，多线程和多进程性能差别不大
# 线程调度相较于进程调度更加轻量化

# 1. 通过Thread类实例化
import time
import threading


def get_detail_html(url):
    print("get detail html started")
    time.sleep(2)
    print("get detail html end")


def get_detail_url(url):
    print("get detail url started")
    time.sleep(4)
    print("get detail url end")


# 2. 通过继承Thread来实现多线程


class GetDetailHtml(threading.Thread):
    def __init__(self, name):
        super().__init__(name=name)

    def run(self):
        print("get detail html started")
        time.sleep(2)
        print("get detail html end")


class GetDetailUrl(threading.Thread):
    def __init__(self, name):
        super().__init__(name=name)

    def run(self):
        print("get detail url started")
        time.sleep(4)
        print("get detail url end")


if __name__ == '__main__':
    # thread1 = threading.Thread(target=get_detail_html, args=("",))  # threading类实例化只能传递函数名，参数使用tuple传递
    # thread2 = threading.Thread(target=get_detail_url, args=("",))  # threading类实例化只能传递函数名，参数使用tuple传递
    # thread1.setDaemon(True)  # 设置为守护线程，主线程关闭掉，守护线程关闭掉
    # thread2.setDaemon(True)
    thread1 = GetDetailHtml("get_detail_html")
    thread2 = GetDetailUrl("get_detail_url")
    start_time = time.time()
    thread1.start()
    thread2.start()
    thread1.join()  # 阻塞，等两个线程执行后再进行打印
    thread2.join()
    # 整个时间为单一线程的最大时间，体现了并发
    # print("last time {}".format(time.time() - start_time))

    print(f"last time {time.time() - start_time}")
    # 时间为0
    # 存在三个线程 两个创建的线程以及一个记录时间的主线程
    # 引申的需求，当主线程退出时，子线程kill掉  使用setDaemon 设置子线程为守护线程



